home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / dskutil / 2m30src.zip / 2MSYS.ASM < prev    next >
Assembly Source File  |  1995-03-06  |  22KB  |  575 lines

  1.  
  2. ;┌───────────────────────────────────────────────────────────────────┐
  3. ;│                                                                   │
  4. ;│                  █████ █   █   █████ █   █ █████                  │
  5. ;│                      █ ██ ██   █      █ █  █                      │
  6. ;│                  █████ █ █ █   █████   █   █████                  │
  7. ;│                  █     █   █       █   █       █                  │
  8. ;│                  █████ █   █ █ █████   █   █████                  │
  9. ;│                                                                   │
  10. ;│                                                                   │
  11. ;│         2M 3.0  -  (C) 1993-1995  Ciriaco García de Celis.        │
  12. ;│                                                                   │
  13. ;│      SOPORTE PARA DISQUETES CON MAYOR CAPACIDAD DE LA NORMAL      │
  14. ;│                    CREADOS POR LA UTILIDAD 2MF                    │
  15. ;│                                                                   │
  16. ;│       * * *   Versión instalable desde el CONFIG.SYS  * * *       │
  17. ;│                                                                   │
  18. ;│ - Sólo para AT y superiores con controladora y unidades de alta.  │
  19. ;│ - Programación directa del controlador de disquetes y del DMA.    │
  20. ;│ - Soporte para sectores de más de 512 bytes (economizar GAPs).    │
  21. ;│ - Mezcla de sectores de distinto tamaño en la misma pista.        │
  22. ;│ - Ruptura del límite habitual de 80 pistas (incluido 360K).       │
  23. ;│ - Emulación de sectores de 512 bytes en INT 13h.                  │
  24. ;│ - Función 5 (INT 13h) reforzada para formatear los nuevos discos. │
  25. ;│ - El soporte residente opera eficazmente bajo DOS y WINDOWS 3.X   │
  26. ;│                                                                   │
  27. ;│   Emplear TASM /m5, TLINK y EXE2BIN para obtener un fichero SYS   │
  28. ;│                                                                   │
  29. ;└───────────────────────────────────────────────────────────────────┘
  30.  
  31.                .286                    ; versión para AT o superior
  32.  
  33. ON             EQU   1                 ; constantes booleanas
  34. OFF            EQU   0
  35.  
  36. ; ------------ Macros de propósito general.
  37.  
  38. XPUSH          MACRO regmem            ; apilar lista de registros
  39.                  IRP rm, <regmem>
  40.                    PUSH rm
  41.                  ENDM
  42.                ENDM
  43.  
  44. XPOP           MACRO regmem            ; desapilar lista de registros
  45.                  IRP rm, <regmem>
  46.                    POP rm
  47.                  ENDM
  48.                ENDM
  49.  
  50. XPUSHA         MACRO
  51.                  PUSHA
  52.                ENDM
  53.  
  54. XPOPA          MACRO
  55.                  POPA
  56.                ENDM
  57.  
  58. XSHL           MACRO regmem, cuenta
  59.                  SHL regmem,cuenta
  60.                ENDM
  61.  
  62. DELAY          MACRO                   ; estados de espera
  63.                  JMP SHORT $+2         ; para AT obsoleto
  64.                  JMP SHORT $+2
  65.                ENDM
  66.  
  67. DDS            MACRO
  68.                PUSH  40h
  69.                POP   DS
  70.                ENDM
  71.  
  72. DES            MACRO
  73.                PUSH  40h
  74.                POP   ES
  75.                ENDM
  76.  
  77. PMICRO         MACRO                   ; retardo de aprox. 15,09 µs
  78.                LOCAL pmicro_iter       ; (exactamente 18/1193180 sg.)
  79. pmicro_iter:   DELAY
  80.                IN    AL,61h            ; Esta macro puede ejecutarse
  81.                AND   AL,10h            ; repetitivamente (se apoya en
  82.                CMP   AL,AH             ; AX) para hacer retardos a
  83.                JE    pmicro_iter       ; través de la temporización
  84.                MOV   AH,AL             ; del refresco de la memoria
  85.                ENDM                    ; dinámica de los AT.
  86.  
  87. ; ------------ Programa.
  88.  
  89. _PRINCIPAL     SEGMENT
  90.                ASSUME CS:_PRINCIPAL, DS:_PRINCIPAL
  91.  
  92.                ORG   0
  93.  
  94. ini_residente  EQU   $
  95.  
  96.                DD    -1           ; encadenamiento con otros drivers
  97. tipo_drive     DW    8000h        ; palabra de atributo:
  98.                                   ; bit 15 a 1: dispositivo caracteres
  99.                                   ; bit 14 a 0: sin control IOCTL
  100.                DW    estrategia   ; rutina de estrategia
  101.                DW    interrupcion ; rutina de interrupción
  102.                DB    "2M$     "   ; nombre del dispositivo
  103.  
  104. estrategia     PROC  FAR
  105.                MOV   CS:pcab_pet_segm,ES
  106.                MOV   CS:pcab_pet_desp,BX
  107.                RET
  108. estrategia     ENDP
  109.  
  110. interrupcion   PROC  FAR
  111.                CALL  main  ; tras instalar: XPUSH <DS, BX> y MOV BX,??
  112. pcab_pet_segm  DW    ?
  113.                MOV   DS,BX
  114.                DB    0BBh  ; opcode de MOV BX,??
  115. pcab_pet_desp  DW    ?
  116.                MOV   WORD PTR [BX+3],8103h  ; código de error
  117.                XPOP  <BX, DS>
  118.                RET
  119. interrupcion   ENDP
  120.  
  121. ; ****************************************
  122. ; *                                      *
  123. ; *   D A T O S    R E S I D E N T E S   *
  124. ; *                                      *
  125. ; ****************************************
  126.  
  127. ; ------------ Identificación estandarizada del programa.
  128.  
  129. program_id     LABEL BYTE
  130. segmento_real  DW    0   ; segmento real donde será cargado
  131. offset_real    DW    0   ; offset real     "     "     "
  132. longitud_total DW    0   ; zona de memoria ocupada (párrafos)
  133. info_extra     DB    02h ; bits 0, 1 y 2-> 000: normal, con PSP
  134.                          ;                 001: bloque UMB XMS
  135.                          ;                 010: *.SYS
  136.                          ;                 011: *.SYS formato EXE
  137.                          ; bit 7 a 1: «extension_id» definida
  138. multiplex_id   DB    0   ; número Multiplex de este TSR
  139. vectores_id    DW    tabla_vectores
  140. extension_id   DW    0
  141.                DB    "*##*"
  142. autor_nom_ver  DB    "CiriSOFT:2M:3.0",0
  143.  
  144.                DB    2  ; número de vectores de interrupción usados
  145. tabla_vectores EQU   $
  146. vieja_i13      DB    13h           ; INT 13h
  147. ant_int13      LABEL DWORD         ; dirección original
  148. ant_int13_off  DW    0
  149. ant_int13_seg  DW    0
  150.                DB    2Fh           ; INT 2Fh
  151. ant_int2F      LABEL DWORD         ; dirección original
  152. ant_int2F_off  DW    0
  153. ant_int2F_seg  DW    0
  154.  
  155. ; ***********************************************
  156. ; *                                             *
  157. ; *   C O D I G O   Y   D A T O S   D E   2 M   *
  158. ; *                                             *
  159. ; ***********************************************
  160.  
  161.                INCLUDE 2MKERNEL.INC
  162.  
  163. fin_residente  EQU   $  ; fin del área residente sin contar el buffer
  164.  
  165. bytes_resid    EQU   fin_residente-ini_residente
  166.  
  167.  
  168. ; *****************************
  169. ; *                           *
  170. ; *   I N S T A L A C I O N   *
  171. ; *                           *
  172. ; *****************************
  173.  
  174. main           PROC
  175.                ADD   SP,2              ; quitar dirección de retorno
  176.                XPUSH <AX, BX, CX, DX, SI, DI, BP, DS, ES>
  177.                PUSH  CS
  178.                POP   DS
  179.                MOV   WORD PTR interrupcion,531Eh  ; opcode PUSH DS,BX
  180.                MOV   BYTE PTR interrupcion+2,0BBh ; opcode MOV BX,??
  181.                PUSH  CS
  182.                POP   ES
  183.                CALL  inic_general      ; inicializar ciertas variables
  184.                CALL  pc_ok?
  185.                TEST  error,0FFFFh
  186.                JNZ   exit_ins
  187.                CALL  mx_get_handle     ; obtener entrada Multiplex
  188.                JNC   handle_ok
  189.                OR    error,MX64FULL    ; no quedan entradas
  190.                JMP   exit_ins
  191. handle_ok:     MOV   multiplex_id,AH   ; entrada multiplex para 2M
  192.                CALL  preservar_ints    ; tomar nota de vectores
  193.                MOV   AX,CS
  194.                LEA   BX,buffer_io
  195.                CALL  testDMA
  196.                JNC   dma_ml_ok         ; no hay problemas con el DMA
  197.                OR    accion,BUFFERPLUS ; sí: aviso al usuario
  198.                MOV   CX,dma_fix
  199.                ADD   buffer,CX         ; nuevo buffer
  200.                MOV   AX,longitud_total
  201.                ADD   AX,dma_fixp
  202.                MOV   longitud_total,AX ; nuevo consumo de memoria
  203. dma_ml_ok:     MOV   DI,100h
  204.                CALL  activar_ints      ; interceptar vectores
  205.                MOV   AX,sbootseg
  206.                AND   AX,AX
  207.                JZ    exit_ins          ; no hay copia SuperBOOT
  208.                PUSH  ES
  209.                MOV   ES,AX
  210.                MOV   BX,ES:[0]
  211.                MOV   ES:[BX].control2m_flag,OFF  ; anularla control A:
  212.                MOV   BX,ES:[2]
  213.                MOV   ES:[BX].control2m_flag,OFF  ; anularla control B:
  214.                POP   ES
  215. exit_ins:      CALL  info
  216.                MOV   BX,pcab_pet_segm
  217.                MOV   ES,BX
  218.                MOV   BX,pcab_pet_desp
  219.                MOV   WORD PTR ES:[BX+3],100h ; indicar retorno correcto
  220.                MOV   AX,longitud_total
  221.                MOV   CL,4
  222.                SHL   AX,CL
  223.                TEST  error,0FFFFh
  224.                JZ    exit_ok
  225.                MOV   WORD PTR ES:[BX+14],0   ; OFFSET 0: no quedará
  226.                MOV   WORD PTR ES:[BX+16],CS  ; instalado en memoria
  227.                JMP   exit_interr
  228. exit_ok:       MOV   WORD PTR ES:[BX+14],AX  ; OFFSET al último byte residente
  229.                MOV   WORD PTR ES:[BX+16],CS
  230. exit_interr:   XPOP  <ES, DS, BP, DI, SI, DX, CX, BX, AX>
  231.                RETF
  232. main           ENDP
  233.  
  234.  
  235. ;*********************************************************
  236. ;*                                                       *
  237. ;*  SUBRUTINAS DE PROPOSITO GENERAL PARA LA INSTALACION  *
  238. ;*                                                       *
  239. ;*********************************************************
  240.  
  241.                INCLUDE 2MUTIL.INC
  242.  
  243. ; ------------ Inicializar ciertas variables.
  244.  
  245. inic_general   PROC
  246.                MOV   AX,(bytes_resid+tbuffer+15)/16
  247.                MOV   longitud_total,AX ; memoria necesaria
  248.                MOV   segmento_real,CS  ; anotar segmento del bloque
  249.                MOV   offset_real,0     ; ídem con el offset
  250.                MOV   DL,0
  251.                CALL  tipo_disco
  252.                JNC   hay_unidad
  253.                MOV   DL,1
  254.                CALL  tipo_disco
  255.                JNC   hay_unidad
  256.                OR    error,MALBIOS     ; no hay disqueteras
  257.                RET
  258. hay_unidad:    MOV   DL,0
  259.                CALL  tipo_disco
  260.                MOV   info_A.tipo_drv,BL  ; guardar tipo unidad A:
  261.                MOV   DL,1
  262.                CALL  tipo_disco
  263.                MOV   info_B.tipo_drv,BL  ; guardar tipo unidad B:
  264.                RET
  265. inic_general   ENDP
  266.  
  267. ; ------------ Informar al usuario.
  268.  
  269. info           PROC
  270.                LEA   DX,instalado_txt
  271.                TEST  error,0FFFFh
  272.                JZ    info_ins_ok
  273.                LEA   DX,noinstall_txt
  274.                CALL  print
  275.                JMP   info_err
  276. info_ins_ok:   CALL  print
  277.                CALL  info_drvs
  278. info_err:      LEA   DX,err_malpc
  279.                TEST  error,MALPC
  280.                JNZ   fin_info
  281.                LEA   DX,err_maldos
  282.                TEST  error,MALDOS
  283.                JNZ   fin_info
  284.                LEA   DX,err_malbios
  285.                TEST  error,MALBIOS
  286.                JNZ   fin_info
  287.                LEA   DX,err_maldrv
  288.                TEST  error,MALDRV
  289.                JNZ   fin_info
  290.                LEA   DX,err_mx64full
  291.                TEST  error,MX64FULL
  292.                JZ    info_war
  293. fin_info:      CALL  print
  294. info_war:      TEST  accion,BUFFERPLUS
  295.                JZ    no_warn
  296.                LEA   DX,dma_cross_txt
  297.                CALL  print
  298. no_warn:       RET
  299. info           ENDP
  300.  
  301.                ; --- Informar de las unidades controladas por 2M.
  302.  
  303. info_drvs      PROC
  304.                MOV   DL,0
  305.                CALL  tipo_disco
  306.                CALL  pr_tipo
  307.                MOV   DL,1
  308.                CALL  tipo_disco
  309.                CALL  pr_tipo
  310.                LEA   DX,crlf_txt
  311.                CALL  print
  312.                RET
  313. info_drvs      ENDP
  314.  
  315.                ; --- Imprimir unidad y su tipo.
  316.  
  317. pr_tipo        PROC
  318.                CMP   BL,2
  319.                JE    tp_ok
  320.                CMP   BL,4
  321.                JE    tp_ok
  322.                CMP   BL,5
  323.                MOV   BL,5
  324.                JAE   tp_ok
  325.                RET
  326. tp_ok:         PUSH  BX
  327.                ADD   DL,'A'
  328.                MOV   AH,2
  329.                INT   21h
  330.                POP   BX
  331.                SUB   BL,2
  332.                MOV   BH,0
  333.                SHL   BX,1
  334.                ADD   BX,OFFSET tabla_ndrvs
  335.                MOV   DX,[BX]
  336.                CALL  print
  337.                RET
  338. pr_tipo        ENDP
  339.  
  340. ; ------------ Comprobar que la configuración es la adecuada. Para
  341. ;              saber si la INT 13h de este ordenador acaba llamando a
  342. ;              la INT 40h, se desvía la INT 40h y se provoca un inocuo
  343. ;              reset de disquetes vía INT 13h para comprobar si pasa
  344. ;              por la INT 40h. Si está cargado el código SuperBOOT, se
  345. ;              utiliza no obstante siempre la INT 13h (para anularlo
  346. ;              por completo).
  347.  
  348. pc_ok?         PROC
  349.                CALL  SuperBOOT?
  350.                JNE   no_superboot
  351.                MOV   sbootseg,AX       ; segmento SuperBOOT
  352.                JMP   test_dos          ; es SuperBOOT: usar INT 13h
  353. no_superboot:  CALL  test_i40
  354.                TEST  accion,I40
  355.                JZ    test_dos          ; no soportada la INT 40h
  356.                MOV   nueva_i13,40h
  357.                MOV   vieja_i13,40h     ; usar INT 40 en vez de INT 13
  358. test_dos:      MOV   AH,30h
  359.                INT   21h
  360.                XCHG  AH,AL
  361.                CMP   AX,31Eh           ; ¿DOS 3.30 o superior?
  362.                MOV   AX,MALDOS
  363.                JB    pc_nok
  364.                CALL  testAT
  365.                MOV   AX,MALPC
  366.                JC    pc_nok
  367.                TEST  error,MALBIOS
  368.                JNZ   pc_ok             ; con ese error vale
  369.                MOV   AX,MALDRV
  370.                CMP   info_A.tipo_drv,2 ; ¿unidad A: de 1.2?
  371.                JE    pc_ok
  372.                CMP   info_A.tipo_drv,4 ; ¿unidad A: de 1.44 ó 2.88?
  373.                JAE   pc_ok
  374.                CMP   info_B.tipo_drv,2 ; ¿unidad B: de 1.2?
  375.                JE    pc_ok
  376.                CMP   info_B.tipo_drv,4 ; ¿unidad B: de 1.44 ó 2.88?
  377.                JAE   pc_ok
  378. pc_nok:        OR    error,AX
  379. pc_ok:         RET
  380. pc_ok?         ENDP
  381.  
  382.                ; --- Devolver ZF=1 si 2M está instalado en SuperBOOT.
  383.                ;     La rutina funciona aunque QEMM modifique de modo
  384.                ;     temporal el límite de memoria a casi un mega en
  385.                ;     la llamada a INT 12h.
  386.  
  387. SuperBOOT?     PROC
  388.                PUSH  ES
  389.                INT   12h               ; tamaño memoria convencional
  390.                MOV   BX,640
  391.                CMP   AX,256
  392.                JB    base_sc_ok        ; dato extraño
  393.                CMP   AX,640
  394.                JA    base_sc_ok        ; dato extraño
  395.                MOV   BX,AX
  396. base_sc_ok:    MOV   AX,BX
  397.                ADD   AX,127            ; redondeo
  398.                MOV   CL,7
  399.                SHR   AX,CL
  400.                SHL   AX,CL             ; hacia frontera de 128K
  401.                MOV   CX,AX
  402.                SUB   CX,BX             ; buscar en área posible
  403.                DEC   AX
  404.                MOV   BX,64
  405.                MUL   BX                ; AX = segmento de SuperBOOT
  406.                CLD
  407. scan_boot:     MOV   ES,AX
  408.                MOV   DI,6
  409.                LEA   SI,id_boot
  410.                PUSH  CX                ; *
  411.                MOV   CX,id_boot_tam
  412.                REP   CMPSB
  413.                POP   CX                ; *
  414.                JE    haysb_ret         ; ZF = 1 -> 2M SuperBOOT
  415.                SUB   AX,64
  416.                LOOPNZ scan_boot        ; buscar 1K más abajo
  417. nohaysb_ret:   CMP   SP,0              ; ZF = 0 -> no es SuperBOOT
  418. haysb_ret:     POP   ES
  419.                RET
  420. SuperBOOT?     ENDP
  421.  
  422.                ; --- Comprobar si la INT 40h está en uso
  423.  
  424. test_i40:      XPUSH <DS, ES>          ; *
  425.                MOV   AX,3540h
  426.                INT   21h
  427.                XPUSH <ES, BX>          ; vector de INT 40h original
  428.                LEA   DX,i40_aux
  429.                MOV   AX,2540h
  430.                INT   21h               ; establecer nueva INT 40h
  431.                XOR   AX,AX
  432.                MOV   DL,0
  433.                INT   13h               ; reset de disco
  434.                XPOP  <DX, DS>
  435.                MOV   AX,2540h
  436.                INT   21h               ; restaurar INT 40h original
  437.                XPOP  <ES, DS>          ; *
  438.                RET
  439.  
  440. i40_aux        PROC
  441.                OR    CS:accion,I40     ; sí utilizada INT 40h
  442.                IRET                    ; desde la INT 13h
  443. i40_aux        ENDP
  444.  
  445.                ; --- Detectar 286 ó superior.
  446.  
  447. testAT         PROC
  448.                PUSH  AX
  449.                PUSHF
  450.                POP   AX
  451.                OR    AH,70h        ; intentar activar bit 12, 13 ó 14
  452.                PUSH  AX            ; del registro de estado
  453.                POPF
  454.                PUSHF
  455.                POP   AX
  456.                AND   AH,0F0h
  457.                CMP   AH,0F0h
  458.                JE    testedAT
  459.                STC
  460. testedAT:      CMC                 ; CF = 0 en AT y 1 en PC/XT
  461.                POP   AX
  462.                RET
  463. testAT         ENDP
  464.  
  465. ; ------------ Comprobar que el buffer para el DMA en la copia
  466. ;              residente no cruza una frontera. En ese caso se emplea
  467. ;              otro buffer ubicado tras el habitual, lo que aumenta el
  468. ;              consumo de memoria de este área. A la entrada AX apunta
  469. ;              al segmento que contendrá el buffer y BX el offset. Si
  470. ;              se produce el cruce, dma_fix devuelve la cuantía en que
  471. ;              hay que incrementar (en bytes) la dirección base para
  472. ;              evitarlo y dma_fixp también (pero en párrafos).
  473.  
  474. testDMA        PROC
  475.                XPUSH <AX, CX, DX>
  476.                MOV   CX,16
  477.                MUL   CX
  478.                ADD   AX,BX
  479.                ADC   DX,0              ; DX:AX = dirección 20 bits
  480.                MOV   CX,DX
  481.                PUSH  AX
  482.                ADD   AX,tbuffer-1      ; buffer para el mayor sector
  483.                ADC   DX,0
  484.                POP   AX
  485.                CMP   DX,CX
  486.                JE    dmatested
  487.                NEG   AX
  488.                MOV   dma_fix,AX
  489.                ADD   AX,15
  490.                MOV   CL,4
  491.                SHR   AX,CL
  492.                MOV   dma_fixp,AX
  493.                STC                     ; CF=1 -> cruza frontera
  494. dmatested:     XPOP  <DX, CX, AX>
  495.                RET
  496. testDMA        ENDP
  497.  
  498. ; ***********************************************
  499. ; *                                             *
  500. ; *   D A T O S    N O    R E S I D E N T E S   *
  501. ; *                                             *
  502. ; ***********************************************
  503.  
  504. ; ------------ Gestión de memoria y control de instalación.
  505.  
  506. dma_fix        DW    ?         ; bytes para alargar buffer (por DMA)
  507. dma_fixp       DW    ?         ; párrafos
  508.  
  509. offsets_ints   DW    2         ; número de vectores interceptados
  510. nueva_i13      DB    13h       ; tabla de offsets de los vectores
  511.                DW    ges_int13 ; de interrupción interceptados
  512.                DB    2Fh
  513.                DW    ges_int2F
  514.  
  515. MALPC          EQU   1         ; Códigos de error
  516. MALDOS         EQU   2
  517. MALBIOS        EQU   4
  518. MALDRV         EQU   8
  519. MX64FULL       EQU 128
  520. ERRSINTAX      EQU 256         ; no usado (utilizado en 2MUTIL.INC)
  521.  
  522. BUFFERPLUS     EQU   8         ; códigos de acción e información
  523. I40            EQU  16
  524.  
  525. error          DW    0         ; variable para acumular errores
  526. accion         DB    0         ; variable que indica lo sucedido
  527. param_ayuda    DB    ?         ; no utilizado (usado en 2MUTIL.INC)
  528.  
  529. sbootseg       DW    0         ; segmento SuperBOOT (si presente)
  530.  
  531. id_boot        DB    "2M-STV"          ; marca de presencia SuperBOOT
  532. id_boot_tam    EQU   $-OFFSET id_boot
  533.  
  534. ; ------------ Texto.
  535.  
  536. instalado_txt  DB    13,10,"2M 3.0 instalado en ",255
  537.                DB    13,10,"2M 3.0 installed on ",0
  538.  
  539. tabla_ndrvs    DW    t12
  540.                DW    0
  541.                DW    t144
  542.                DW    t288
  543. t12            DB    ":1.2M ",0
  544. t144           DB    ":1.44M ",0
  545. t288           DB    ":2.88M ",0
  546.  
  547. noinstall_txt  DB    13,10,"2M 3.0 no instalado.",13,10,255
  548.                DB    13,10,"2M 3.0 not installed.",13,10,0
  549.  
  550. err_malpc      DB    "  - Error: Necesario ordenador AT. Utilice 2MX en esta máquina.",13,10,7,255
  551.                DB    "  - Error: Needs AT system. Use 2MX on this computer.",13,10,7,0
  552.  
  553. err_mx64full   DB    "  - Error: Ya hay 64 programas residentes con la misma técnica.",13,10,255
  554.                DB    "  - Error: There are already 64 TSR's with the same technique."
  555. crlf_txt       DB    13,10,0
  556.  
  557. err_maldos     DB    "  - Error: necesaria versión DOS 3.30 ó posterior.",13,10,7,255
  558.                DB    "  - Error: needs at least DOS 3.30 or above.",13,10,7,0
  559.  
  560. err_malbios    DB    "  - Error: No puedo detectar el tipo de las unidades. Instale 2M-ABIOS antes.",13,10,255
  561.                DB    "  - Error: Impossible to detect drive types. Please install 2M-ABIOS before.",13,10,0
  562.  
  563. err_maldrv     DB    "  - Error: Necesaria(s) unidad(es) de alta densidad.",13,10,255
  564.                DB    "  - Error: Needs high-density floppy drive(s).",13,10,0
  565.  
  566. dma_cross_txt  DB    "  - Nota: El buffer de E/S cruzaba una frontera de DMA y fue ampliado.",13,10
  567.                DB    "          Cambie la ubicación en memoria de 2M para ahorrar unos bytes.",13,10,255
  568.                DB    "  - Note: I/O buffer has been extended because 2M crosses a DMA boundary.",13,10
  569.                DB    "          Modify the memory location of 2M to save a little memory.",13,10,0
  570.  
  571. buffer_aux     DB    64 DUP (0)   ; buffer para alguna función del DOS
  572.  
  573. _PRINCIPAL     ENDS
  574.                END
  575.